package work.base.data.number;

import cn.hutool.core.convert.Convert;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @author shenminglong@kedacom.com
 * @date 2022-01-05
 * BigDecimal 用于精确计算 小数位
 */
public class BigDecimalTest {
    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("12.231523");
        // setScale保留小数位 返回新的BigDecimal对象
        // ROUND_HALF_UP 四舍五入 5的时候向上   ROUND_HALF_DOWN 四舍五入 5的时候向下
        // ROUND_UP 进位处理 ROUND_DOWN 直接删除多余位
        BigDecimal b2 = b1.setScale(3,BigDecimal.ROUND_HALF_UP);
        BigDecimal b3 = b1.setScale(3,BigDecimal.ROUND_HALF_DOWN);
        BigDecimal b4 = b1.setScale(3,BigDecimal.ROUND_DOWN);
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);

        // 0不能作除数 会报错 divide
        BigDecimal zero = new BigDecimal("1");
        BigDecimal zeroRes = b1.divide(zero,1,BigDecimal.ROUND_HALF_UP);

        //类型转化 转化为字符串
        String str = Convert.toStr(b1);
        String str1 = b1.toString();
        System.out.println(str);

        // BigDecimal 转化为百分数
        // 1 使用NumberFormat
        NumberFormat percent = NumberFormat.getPercentInstance();
        // 设置数字的小数部分中允许的最大位数
        percent.setMaximumFractionDigits(3);
        String percentStr = percent.format(b1.doubleValue()).replace(",","");
        String percentStr1 = percent.format(new BigDecimal("1").doubleValue()).replace(",","");
        System.out.println(percentStr);
        System.out.println(percentStr1);
        // 2 使用DecimalFormat 推荐这种
        BigDecimal a1 = new BigDecimal(6);
        BigDecimal a2 = new BigDecimal(3);
        BigDecimal r = a2.divide(a1, 4, BigDecimal.ROUND_HALF_UP);
        DecimalFormat decimalFormat = new DecimalFormat("0.00%");
        System.out.println(decimalFormat.format(r));


        // valueOf()方法 double转化为BigDecimal类型
        BigDecimal bigDecimal1 = BigDecimal.valueOf(3600);


        // BigDecimal和0做比较 用compareTo方法
        // 不能用equals方法, 因为不仅仅比较值的大小是否相等，首先比较的是scale（保留位数）
        BigDecimal zero1 = new BigDecimal("0.0000");
        if(zero1.compareTo(BigDecimal.ZERO) == 0) {
            System.out.println("BigDecimal和0 使用compareTo作比较的结果是等于的");
        }
        if(!zero1.equals(BigDecimal.ZERO)) {
            System.out.println("BigDecimal和0 使用equals方法比较是不等的");
        }

        System.out.println("END");

    }
}
